package com.aaa.threadadvanced.demo02;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * @author C-Q
 * @version 1.1.0
 * @Description: 如何创建线程池
 * Executor  线程池的顶级接口: 在该接口只有一个抽象方法void execute(Runnable command);
 *      该方法用来执行Runnable类型的任务。
 *ExecutorService: 它是Executor的子接口，它里面包含的方法:
 *       void shutdown(); 关闭线程池，把线程池中提交的任务执行完后再关闭
 *       List<Runnable> shutdownNow(); 立即关闭，把一些等待的任务关闭。
 *       boolean isShutdown(); 判断线程池是否关闭。
 *       boolean isTerminated();判断线程池是否终止。---表示任务是否执行完。
 *       <T> Future<T> submit(Callable<T> task); 提交Callable类型的任务给线程池。
 *       Future<?> submit(Runnable task); 提交Runnable类型的任务给线程池
 *
 *
 *Executors: 它是一个工具类，可以帮你创建相应的线程池对象。
 *      (1)newSingleThreadExecutor 创建单一线程池：适合只有单线程执行，要求线程按照顺序执行。
 *      (2)newFixedThreadPool    创建固定长度的线程池:   适合服务器负载比较重。
 *      (3) newCachedThreadPool      创建可变线程池:  适合短期任务比较重。
 *      (4) newScheduledThreadPool     创建延迟线程池:   适合延期执行任务的线程。
 * @date 2022/11/2
 */
public class Test01 {
    public static void main(String[] args) {

        //1创建单一线程池---池子中有且仅有一个线程对象
//        ExecutorService executorService = Executors.newSingleThreadExecutor();

        //2创建固定长度的线程池--池子中线程的数量是固定的，里面预先会创建n个线程对象；
        //创建的对象多少和设置任务的多少和创建固定长度的线程池有关
//        ExecutorService executorService = Executors.newFixedThreadPool(3);

        //3创建可变长度的线程池--根据任务个数动态创建线程对象,可执行多个任务，线程池会自动创建
//        ExecutorService executorService = Executors.newCachedThreadPool();

        //4延迟线程执行时间
        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);
        //往线程池中提交任务
        for (int i = 0; i <5; i++) {
            final int a=i;
            executorService.schedule(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName()+"~~"+a);
                }
            },10, TimeUnit.SECONDS);

            //以上三种方法的测试
//            executorService.submit(new Runnable() {
//                @Override
//                public void run() {
//                    System.out.println(Thread.currentThread().getName()+"~~~"+a);
//                }
//            });
        }
    }
}
